ssize_t rio_readn(int fd, void *usrbuf, size_t n) 
{
    size_t nleft = n;
    ssize_t nread;
    char *bufp = usrbuf;

    while (nleft > 0) {
	if ((nread = read(fd, bufp, nleft)) < 0) {
	    if (errno == EINTR)
		nread = 0;      
	    else
		return -1;      
	} 
	else if (nread == 0)
	    break;
	nleft -= nread;
	bufp += nread;
    }
    return (n - nleft);
}
